﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BatallaNavalgo.Tests
{
    /// <summary>
    /// Descripción resumida de TestJugador
    /// </summary>
    [TestClass]
    public class TestJugador
    {
        private Jugador jugador;
        public TestJugador()
        {
            Tablero tablero = new Tablero();
            this.jugador = new Jugador(tablero);
        }

        #region Atributos de prueba adicionales
        //
        // Puede usar los siguientes atributos adicionales conforme escribe las pruebas:
        //
        // Use ClassInitialize para ejecutar el código antes de ejecutar la primera prueba en la clase
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup para ejecutar el código una vez ejecutadas todas las pruebas en una clase
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Usar TestInitialize para ejecutar el código antes de ejecutar cada prueba 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup para ejecutar el código una vez ejecutadas todas las pruebas
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestJugadorDebeTener100000PuntosInicialmente()
        {
            Assert.AreEqual(10000, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebePoderColocarUnDisparoConvencionalEnElTableroYRestarSuCostoCorrespondiente()
        {
            Tuple<int, int> posicion = Tuple.Create(0, 4);
            this.jugador.ColocarDisparo(new DisparoConvencional(0),posicion);
            Assert.AreEqual(9800, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebePoderColocarUnaMinaPuntualEnElTableroYRestarSuCostoCorrespondiente()
        {
            Tuple<int, int> posicion = Tuple.Create(0, 4);
            this.jugador.ColocarDisparo(new MinaPuntual(2),posicion);
            Assert.AreEqual(9950, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebePoderColocarUnaMinaDobleEnElTableroYRestarSuCostoCorrespondiente()
        {
            Tuple<int, int> posicion = Tuple.Create(0, 4);
            this.jugador.ColocarDisparo(new MinaDoble(2),posicion);
            Assert.AreEqual(9900, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebePoderColocarUnaMinaTripleEnElTableroYRestarSuCostoCorrespondiente()
        {
            Tuple<int, int> posicion = Tuple.Create(0, 4);
            this.jugador.ColocarDisparo(new MinaTriple(2),posicion);
            Assert.AreEqual(9875, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebePoderColocarUnaMinaPorContactoEnElTableroYRestarSuCostoCorrespondiente()
        {
            Tuple<int, int> posicion = Tuple.Create(0, 4);
            this.jugador.ColocarDisparo(new MinaPorContacto(0),posicion);
            Assert.AreEqual(9850, this.jugador.Puntaje);
        }

        [TestMethod]
        public void TestJugadorDebeRestarse10PuntosPorJugarYPasarDeTurno()
        {
            this.jugador.JugarTurno();
            this.jugador.PasarTurno();
            Assert.AreEqual(9990, this.jugador.Puntaje);
        }

    }
}
